package com.kepus.web.controller;

import com.kepus.common.domainobject.DOCommon;
import com.kepus.common.domainobject.userMgr.DOUser;
import com.kepus.common.enumeration.EnumRole;
import com.kepus.common.enumeration.EnumSex;
import com.kepus.common.viewobject.common.VOCommon;
import com.kepus.common.viewobject.usermgr.VOLoginUser;
import com.kepus.common.viewobject.usermgr.VORegistUser;
import com.kepus.common.viewobject.util.UtilUUID;
import com.kepus.service.mgruser.UserMgrService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * @Controller标注当前类是一个可以处理Http请求的bean
 * @RequestMapping被RequestMappingHandlerMapping识别并映射的具体的url，其中映射条件： 1.value:    映射的url
 * 2.method:   http的请求类型
 * 3.params:   http的请求参数 url?参数 （注意参数和body参数的不同）
 * 4.headers:  http的请求头内容
 * 5.consumes：http请求的MediaType，对应http请求的Content-type
 * 6.produces: http请求的响应MediaType，对应http请求的Accept
 * <p>
 * 注：
 * 1. @Request适用于类和方法；条件都是数组类型，单个参数或； 多个参数与
 * 2. consumers和produces怎么和Content-type及Accept结合的呢？
 * 获取RequestMapping对应RequestMappingInfo对象，里面有consumers和produces信息，当HandlerMapping查找Controller(和Handler一个意思)
 * ，先查看当前RequestMappingInfo是否有consumer和produce信息，然后和request请求中的Content-type/Accept是否匹配，来返回正确的Handler
 */
@Controller
@RequestMapping(value = "/userMgr")
public class UserMgrController {

    /**
     * 通过@Controller和@RequestMapping映射到具体的方法后，就是方法如何接收http数据，以及响应http：springmvc通过注解/签名绑定
     * 入参注解/签名：注解有3个参数，value/required/defaultValue
     * 1.@RequestParam：将http参数绑定的入参， @RequestParam(value="name") String name
     * 2.@CookieValue:绑定Cookie值
     * 3.@RequestHeader：绑定Header值
     * 4.绑定form表单值（post请求的body）到对象：springmvc按照请求参数名和入参对象的属性名匹配，自动填充对象的属性值
     * 5.使用ServletAPI作为参数会自动绑定，例如HttpServletRequest、HTTPSession
     * 6.数据流做为入参，自动绑定HttpServletRequest.getInputStream()/getReader()
     * 7.使用HttpMessageConverter<T>:将请求信息转换为T类型的对象
     * 返回值注解/签名：
     * 1.使用HttpMessageConverter<T>:将T类型的对象输出为http的响应信息
     * <p>
     * HttpMessageConverter如何工作？？？？？？
     * 1. HandlerMappingAdapter有一个List<HttpMessageConverter>属性，HandlerAdapter调用controller的方法时通过HttpMessageConverter
     * 完成转换
     * 2. 常用的json转换器为MappingJackson2HttpMessageConverter:
     * 2.1 依赖jackson包；2.2 T类型为Object类型；2.3 可读取的MIME为application/json; 2.4 响应的媒体类型为application/json
     * 3.默认情况下不会使用HttpMessageConverter进行数据转换，springmvc提供给中途径指定使用HttpMessageConverter：
     * 3.1 使用@RequestBody/@ResponseBody对处理器方法进行注解  *****常用******
     * public @ResponseBody btye[] hello(@RequestBody String name):分别根据@RequestBody String和@ResponseBody
     * byte[]查找合适的HttpMessageConverter<String/byte[]>
     * 3.2 使用HttpEntity<T>/ResponseEntity<T>作为处理器方法的入参和返回值
     * 3.3 @RequestBody/@ResponseBody、HttpEntity<T>/ResponseEntity<T>不需要成对出现
     * 【注】 当处理器方法使用@RequestBody和@Response注解后，SpringMVC使用注册的HttpMessageConverter对请求和响应数据进行转换，Spring
     * 查找转换器的顺序是：先根据请求头和响应头查找；然后根据参数泛型查找，如果查找不到则报错
     */

    /**
     *
     * @RequestMapping只是用来查找HandlerMapping
     *
     * 方法入参/返回值的注解是HandlerAdapter调用处理器函数时使用
     *
     */

    private static final Logger LOGGER = LoggerFactory.getLogger(UserMgrController.class);

    @Autowired
    private UserMgrService userMgrService;

    /**
     * ·
     * 登录：
     * 1.登录成功重定向到首页
     * 2.登录失败返回json数据
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody
    VOCommon login(HttpServletRequest request, @RequestBody VOLoginUser voLoginUser) {
        VOCommon voCommon = new VOCommon();
        String userName = voLoginUser.getUserName();
        String passwd = voLoginUser.getPasswd();
        //转码校验
        HttpSession session = request.getSession(true);
        DOCommon doCommon = userMgrService.login(session.getId(), userName, passwd);
        if (doCommon.isSuccess()) {
            voCommon.setSuccess(true);
        } else {
            voCommon.setSuccess(false);
            voCommon.setMsg(doCommon.getMsg());
        }
        return voCommon;
    }

    /**
     * 查询用户的角色
     * @param request
     * @param userName
     * @return
     */
    @RequestMapping(value = "/userRole", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public VOCommon queryUserRole(HttpServletRequest request, @RequestParam(value = "userName", required = true) String
            userName)
    {
        VOCommon voCommon;
        EnumRole role = userMgrService.queryUserRole(request.getSession().getId(), userName);
        if(role != null)
        {
            voCommon = VOCommon.instance(true, null);
        }
        else {
            voCommon = VOCommon.instance(false, "user not login.");
        }
        return voCommon;
    }

    //注册
    @RequestMapping(value = "/regist", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public VOCommon regist(HttpServletRequest request, @RequestBody VORegistUser voRegistUser) {

        List<DOUser> lstDOUser = new ArrayList();
        for (int i=0; i<10; i++)
        {
            DOUser doUser = new DOUser();
            doUser.setId(UtilUUID.uuid());
            doUser.setRegistDate(System.currentTimeMillis());
            doUser.setLastLoginTime(System.currentTimeMillis());

            doUser.setUserName(voRegistUser.getUserName());
            doUser.setPasswd(voRegistUser.getPasswd());
            doUser.setPhone(voRegistUser.getPhone());
            doUser.setEmail(voRegistUser.getEmail());

            doUser.setSex(EnumSex.valueOf(voRegistUser.getSex()));
            doUser.setRole(EnumRole.valueOf(voRegistUser.getRole()));

            lstDOUser.add(doUser);
        }
        userMgrService.regist(lstDOUser);
        return new VOCommon();
    }

    //分页查询所有用户

    //修改密码

    //修改资料

    //删除用户
}
